package ne.analyzer.importer;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import ne.analyzer.entities.Reference;
import ne.analyzer.util.Utils;

public class NEImporter implements ImporterInf {

	static Pattern pat = Pattern.compile("\\{(.*?)\\}: ([^\\{]+)", Pattern.DOTALL);

	@Override
	public List<String> referencesSplit(String content) {
		List<String> result = new ArrayList<String>();
		Matcher m = pat.matcher(content);
		String currLine = "";
		while (m.find()) {
			String field = m.group(1);
			String value = m.group(2);
			if (field.equals("Reference Type")) {
				if (!currLine.equals("")) {
					result.add(currLine);
					currLine = "";
				}
			}
			currLine = String.format("%s{%s}: %s", currLine, field, value);
		}
		if (!currLine.equals("")) {
			result.add(currLine);
			currLine = "";
		}
		return result;
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public void fieldSplit(String line, Map<String, Object> fields) {
		Matcher m = pat.matcher(line);
		while (m.find()) {
			String field = m.group(1);
			String value = m.group(2);
			Object obj = fields.get(field);
			if (obj == null) {
				fields.put(field, value);
			} else {
				if (obj instanceof List) {
					((List) obj).add(value);
				} else if (obj instanceof String) {
					List<String> nValue = new ArrayList<String>();
					nValue.add((String) obj);
					nValue.add(value);
					fields.put(field, nValue);
				}
			}
		}
	}

	@Override
	public String getDefaultExt() {
		return ".net";
	}

	@Override
	public Reference convert(Map<String, Object> fields) {
		Reference ref = new Reference();
		Iterator<String> keys = fields.keySet().iterator();
		while (keys.hasNext()) {
			String key = keys.next();
			Object value = fields.get(key);
			if (key.equals("Title")) {
				ref.setTitle((String) value);
			} else if (key.equals("Abstract")) {
				ref.set_abstract((String) value);
			} else if (key.equals("Keywords")) {
				ref.setKeywords(Utils.splitWith((String) value, ";"));
			} else if (key.equals("Author")) {
				ref.setAuthors(Utils.splitWith((String) value, ";"));
			} else if (key.equals("Journal")) {
				ref.setSource((String) value);
			} else if (key.equals("Subject")) {
				ref.setSubjects(Utils.splitWith((String) value, ";"));
			}
		}
		/*
		 * Issue=10 , Keywords=容器虚拟化;Docker;机构知识库;云服务平台 , Database Provider=CNKI
		 * 
		 * 
		 * , Abstract=通过采用容器虚拟化技术Docker,解决机构知识库系统快速安装部署、平滑升级和云服务平台建立的问题。
		 * 以北京工业大学机构知识库建设为例,提出机构知识库建设Docker虚拟化解决方案,将机构知识库系统容器化、镜像化,
		 * 以此构建机构知识库云服务平台,并进行快速分发应用。Docker容器虚拟化技术在机构知识库中的运用,能够加快机构知识库的推广应用,降低维护、
		 * 升级成本,提高工作效率。 , Title=容器虚拟化技术在机构知识库系统中的探索实践 , Journal=图书情报导刊 ,
		 * ISBN/ISSN=2096-1162 , Reference Type=Journal Article ,
		 * Pages=103-108+118 , Year=2016 , Author=邓红;涂飞平;李永芳;丁君涛; , Author
		 * Address=北京工业大学图书馆; , Notes=14-1383/G2 }, {Issue=04 ,
		 * Keywords=科学研究组织机构;知识库;军事医学 , Database Provider=CNKI
		 */
		return ref;
	}

}
